/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.criar;

import br.com.foxinline.modelo.Configuracao;
import br.com.foxinline.modelo.Grupo;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.servico.ConfiguracaoServico;
import br.com.foxinline.servico.GrupoServico;
import br.com.foxinline.servico.ProtocoloServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.util.Msg;
import java.io.IOException;
import java.io.Serializable;
import java.security.Principal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

/**
 *
 * @author roniere
 */
@ManagedBean
@SessionScoped
public class ManagerLayout implements Serializable {

    @EJB
    UsuarioServico usuarioServico;
    @EJB
    ProtocoloServico protocoloServico;
    @EJB
    ConfiguracaoServico configuracaoServico;
    @EJB
    GrupoServico grupoServico;
    private String user;
    private String mes;
    private int dia;
    private Configuracao configuracao;
    private Usuario usuarioLogado;
    private Grupo grupoTabularium;
    private Grupo grupoTabulario;
    private boolean primeiroAcesso;
    private String token;
    private String senha;
    private String novaSenha;
    private boolean ativarPoll;
    private int count;

    @PostConstruct
    public void init() {
        Principal userPrincipal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
        primeiroAcesso();

        configuracao = configuracaoServico.find();

        usuarioLogado = usuarioServico.getCurrentUser();

        if (userPrincipal != null) {
            String userPrincipalName = userPrincipal.getName();

            this.user = usuarioServico.getNomeUsuario(userPrincipalName);
            String[] nome = this.user.trim().split(" ");
            if (nome.length > 1) {
                this.user = nome[0];
            }
        }

    }

    public String getNomeUsuarioViaToken() {
        return usuarioServico.getNomeViaToken(token).split(" ")[0];
    }

    public void logout() throws IOException {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
        String contextName = servletContext.getContextPath();
        facesContext.responseComplete();
        facesContext.getExternalContext().invalidateSession();
        facesContext.getExternalContext().redirect("/Tabularium-war/login.jsp");
    }

    public void logoutPrimeiroAcesso() throws IOException {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
        String contextName = servletContext.getContextPath();
        facesContext.responseComplete();
        facesContext.getExternalContext().invalidateSession();
//        facesContext.getExternalContext().redirect("/Tabularium-war/login.jsp");
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getMes() {
        GregorianCalendar g = new GregorianCalendar();
        g.setTime(new Date());

        return new SimpleDateFormat("MMM", new Locale("pt", "br")).format(g.getTime());
    }

    public String getAno() {
        GregorianCalendar g = new GregorianCalendar();
        g.setTime(new Date());

        return new SimpleDateFormat("yyyy", new Locale("pt", "br")).format(g.getTime());
    }

    public void setMes(String mes) {
        this.mes = mes;
    }

    public int getDia() {
        GregorianCalendar g = new GregorianCalendar();
        g.setTime(new Date());
        return dia = g.get(GregorianCalendar.DAY_OF_MONTH);
    }

    public void setDia(int dia) {
        this.dia = dia;
    }

    public int quantidadeProtocolosRecebidos() {
//        return protocoloServico.protocolosRecebidos(null, false).size();
        return 0;
    }

    public void primeiroAcesso() {
        if (token == null) {
            Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
            token = params.get("create_password_token");
        }

        if (token == null) {
            return;
        }
        if (usuarioServico.getCurrentUser() != null) {
            try {
                logoutPrimeiroAcesso();
            } catch (IOException ex) {
                Logger.getLogger(ManagerLayout.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        primeiroAcesso = usuarioServico.getNomeViaToken(token) != null;
    }

    public void atualizarLoginPrimeiroAcesso() {
        if (novaSenha.equals(senha)) {
            if (token != null) {
                Usuario usuarioAtual = usuarioServico.getUsuarioAtualViaToken(token);
                usuarioAtual.setSenha(Usuario.encryptPassword(senha));
                usuarioServico.atualizar(usuarioAtual, true);

                Msg.messagemInfo("/n/n Acesso ao sistema Tabularium efetuado com sucesso !");
                ativarPoll = true;
            }
        } else {
            Msg.messagemError("Senhas não conferem !\n Por favor tente novamente.");
        }
    }

    /**
     * Verifica se o usuário logado é admin do sistema
     *
     * @return
     */
    public boolean isAdmin() {
        return usuarioServico.isAdmin();
    }
    
    public void increment(){
        count++;
        if (count == 4) {
            Msg.messagemInfoRedirect("", "index.xhtml");
        }
    }
    
    public String mensagem(){
        return "Você será redirecionado para a página de login em " + count + " segundos !";
    }

    public Usuario getUsuarioLogado() {
        return usuarioLogado;
    }

    public void setUsuarioLogado(Usuario usuarioLogado) {
        this.usuarioLogado = usuarioLogado;
    }

    // Configurações do projeto ↓
    public void salvarConfiguracoes() {
        try {
            configuracaoServico.atualizar(configuracao);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void display() {
        if (!configuracao.getProjetoTabularium()) {
            configuracao.setGerarNumeroAutomatico(Boolean.FALSE);
        }
    }

    public Configuracao getConfiguracao() {
        return configuracao;
    }

    public void setConfiguracao(Configuracao configuracao) {
        this.configuracao = configuracao;
    }

    /**
     * Indica se o projeto deve gerar o número do protocolo automático, apenas
     * se o projeto for Protocolo
     *
     * @return
     */
    public Boolean getGerarNumeroAutomatico() {
        if (configuracao.getProjetoTabularium()) {
            return !configuracao.getGerarNumeroAutomatico();
        }

        return null;
    }

    /**
     * Indica se o projeto é de Tabularium
     *
     * @return
     */
    public boolean isProjetoTabularium() {
        Boolean projeto = configuracao.getProjetoTabularium();
        boolean id = usuarioLogado.getId() == 1L;
        return projeto || id;
    }

    /**
     * Indica se o projeto é de Tabulario
     *
     * @return
     */
    public boolean isProjetoTabulario() {
        return configuracao.getProjetoTabulario() || usuarioLogado.getId() == 1L;
    }

    public Grupo getGrupoTabulario() {
        return grupoTabulario;
    }

    public void setGrupoTabulario(Grupo grupoTabulario) {
        this.grupoTabulario = grupoTabulario;
    }

    public Grupo getGrupoTabularium() {
        return grupoTabularium;
    }

    public void setGrupoTabularium(Grupo grupoTabularium) {
        this.grupoTabularium = grupoTabularium;
    }

    public boolean isPrimeiroAcesso() {
        return primeiroAcesso;
    }

    public void setPrimeiroAcesso(boolean primeiroAcesso) {
        this.primeiroAcesso = primeiroAcesso;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getNovaSenha() {
        return novaSenha;
    }

    public void setNovaSenha(String novaSenha) {
        this.novaSenha = novaSenha;
    }

    public boolean isAtivarPoll() {
        return ativarPoll;
    }

    public void setAtivarPoll(boolean ativarPoll) {
        this.ativarPoll = ativarPoll;
    }
}
